package com.example.emos.wx.config.shiro;


import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.emos.wx.config.exception.EmosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @ClassName JwtUtil
 * @Author zhangzhixi
 * @Description jwt工具类
 * @Date 2022/8/18 16:42
 * @Version 1.0
 */

@Component
@Slf4j
public class JwtUtil {

    //密钥
    @Value("${emos.jwt.secret}")
    private String secret;

    //过期时间（天）
    @Value("${emos.jwt.expire}")
    private int expire;

    /**
     * JWT加密
     *
     * @param userId 用户id
     * @return 加密后的token
     */
    public String createToken(int userId) {
        /*JWT令牌过期时间-推迟5天*/
        Date date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, expire).toJdkDate();
        //创建加密算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        /*创建令牌的对象*/
        JWTCreator.Builder builder = JWT.create();
        /*设置令牌的信息：用户ID、过期时间、加密对象*/
        return builder.withClaim("userId", userId).withExpiresAt(date).sign(algorithm);
    }


    /**
     * JWT解密
     *
     * @param token token
     * @return 解密后的用户ID
     */
    public int getUserId(String token) {
        try {
            /*解码给定的 Json Web 令牌*/
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("userId").asInt();
        } catch (Exception e) {
            throw new EmosException("令牌无效");
        }
    }

    /**
     * JWT验证
     *
     * @param token token，成功没有异常，失败抛出异常
     */
    public void verifierToken(String token) {
        //创建加密算法对象
        Algorithm algorithm = Algorithm.HMAC256(secret);
        JWTVerifier verifier = JWT.require(algorithm).build();
        verifier.verify(token);
    }
}